home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_c / msqc25t1 / lstsdir.c < prev    next >
C/C++ Source or Header  |  1990-09-07  |  3KB  |  103 lines

  1. /* where.c: Searches directory structure from root and list all occurrences
  2. of a filename matching the search argument from the command line.
  3.  
  4. */
  5.  
  6. #include <stdio.h>
  7. #include <dos.h>
  8. #include <direct.h>
  9. #include <conio.h>
  10. #include <string.h>
  11. #include <malloc.h>
  12.  
  13. /* Global to count matches found */
  14. int count = 0;
  15.  
  16.  
  17. main( int argc, char *argv[])
  18. {
  19. char *curdir,                           /* current directory on entry   */
  20.     sought[80],                         /* pattern to search for        */
  21.     *temp;                              /* temporary work string        */
  22. int curdrive, newdrive,                 /* current and new drives       */
  23.     p, n = 4;                           /* misc counters                */
  24. void searchdir (char *dir, char *ptrn); /* search fcn                   */
  25.  
  26.     for(p=0;p<80;p++)
  27.         sought[p] = 0;
  28.  
  29.     /* Find out where we are */
  30.     curdir = getcwd (NULL, 80);
  31.     _dos_getdrive (&curdrive);
  32.  
  33.     /* Find out what we're looking for */
  34.     if (argc > 1)
  35.         strcpy (sought, argv[1]);   /* patten from cmd line */
  36.  
  37.         /* Get designator for another drive if specified */
  38.     if (sought[1] == ':') {
  39.         newdrive = (toupper (sought[0])) - 64;    /* convert */
  40.         _dos_setdrive (newdrive, &n);             /* set new drive */
  41.         p = (sought[2] == '\\') ? 3 : 2;          /* start of new pattern */
  42.         strcpy (sought, &(sought[p]));            /* take out drive */
  43.     }
  44.     else {
  45.             _dos_getdrive (&newdrive);
  46.     }
  47.  
  48.     /* Add wildcard prefix/suffix if necessary */
  49.     temp = strcat (".", sought);        /* set prefix */
  50.     strcpy (sought, temp);
  51.  
  52.             /* Perform search for pattern starting in root */
  53.     searchdir ("\\", sought);
  54.     printf("\nTotal of %d subdirectories on drive %c:", count, newdrive + 64);
  55.  
  56.                 /* Restore orginal drive and directory */
  57.     _dos_setdrive (curdrive, &n);
  58.     chdir (curdir);
  59. }
  60.  
  61. void searchdir (char *path, char *ptrn)
  62.                                     /* recursive directory search routine */
  63.  
  64.  
  65. #define ANYFILE 0xFF            /* wildcard attribute for any file */
  66.  
  67. {
  68. struct find_t *f;
  69. char    *wholepath;
  70. unsigned    rtn;
  71.  
  72.     chdir (path);                           /* change to new directory  */
  73.     wholepath = getcwd (NULL, 80);          /* get full pathname        */
  74.     printf("%s", wholepath);
  75.     if(wholepath[strlen(wholepath)-1] == '\\')
  76.         printf("\n");
  77.     else printf("\\\n");
  78.  
  79.     f = malloc (sizeof (*f));
  80.  
  81.             /*search for filename matches in this directory */
  82.     rtn = _dos_findfirst (ptrn, ANYFILE, f);
  83.     while (rtn == 0) {                          /* list path */
  84.         ++count;
  85.         rtn = _dos_findnext (f);        /* find next match */
  86.     }
  87.  
  88.                 /* Now search any subdirectories under the directory */
  89.     rtn = _dos_findfirst ("*.*", _A_SUBDIR, f);
  90.     while (rtn == 0) {
  91.         if ((f->attrib == _A_SUBDIR) && (f->name[0] != '.')) {
  92.             searchdir (f->name, ptrn);      /* recursive call   */
  93.             chdir (wholepath);              /* back to this dir */
  94.         }
  95.         rtn = _dos_findnext (f);            /* search next dir  */
  96.     }
  97.  
  98.                                 /* Free allocated space */
  99.     free (wholepath);
  100.     free (f);
  101. }
  102.  
  103.